package com.hu.juc.day03.T1;

import java.util.concurrent.*;

// int corePoolSize,
// int maximumPoolSize,
// long keepAliveTime,
// TimeUnit unit,
// BlockingQueue<Runnable> workQueue,
// ThreadFactory threadFactory,
// RejectedExecutionHandler handler
/**
 *                      ThreadPool七大参数
 * 1、corePoolSize: 线程池中的常驻核心线程数。
 * 2、maximumPoolSize: 线程池中能够容纳同时执行的最大线程数，此值必须大于等于1。
 * 3、keepAliveTime: 多余的空闲线程的存活时间当前池中线程数量超过corePoolSize时， 当空闲时间达到keepAliveTime时，
 *                  多余线程会被销毁直到只剩下corePoolSize个线程为止。
 * 4、unit: keepAliveTime的单位。
 * 5、workQueue: 任务队列，被提交但尚未被执行的任务。
 * 6、threadFactory: 表示生成线程池中工作线程的线程厂,用于创建线程，一般默认的即可。
 * 7、handler: 拒绝策略,表示当队列满了，并且工作线程大于等于线程池的最大线程数(maximumPoolSize) 时如何来拒绝请求执行的runnable的策略。
 */
public class MyThreadPoolDemo {
    public static void main(String[] args) {
        System.out.println(Runtime.getRuntime().availableProcessors());
        ExecutorService threadPool = new ThreadPoolExecutor(
                2,
                5,
                2L,
                TimeUnit.SECONDS,
                new LinkedBlockingDeque<>(3),
                Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.AbortPolicy());
        try {
            for (int i = 1; i <= 10; i++) {
                threadPool.execute(() -> {
                    System.out.println(Thread.currentThread().getName() + "\t办理业务");
                });
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            threadPool.shutdown();
        }
    }

    private static void initPool() {
        //ExecutorService threadPool = Executors.newFixedThreadPool(5);//一个池子五个工作线程，类似一个银行有五个受理窗口
        //ExecutorService threadPool = Executors.newSingleThreadExecutor();//一个池子一个工作线程，类似一个银行有一个受理窗口
        ExecutorService threadPool = Executors.newCachedThreadPool();//一个池子N个工作线程，类似一个银行有N个受理窗口

        try {
            for (int i = 1; i <= 10; i++) {
                threadPool.execute(() -> {
                    System.out.println(Thread.currentThread().getName() + "\t办理业务");
                });
                //暂停一会线程毫秒
                try { TimeUnit.MILLISECONDS.sleep(200);} catch (InterruptedException e) {e.printStackTrace();}
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            threadPool.shutdown();
        }
    }
}
